package bfw3b9.atprin.Interface;

/**
 * Die Klasse XY wird aus Performancegruenden absichtlich nicht gekapselt,
 * da Sie hauptsaechlich zur Uebertragung von Informationen als Rueckgabewert dient!
 * @author Thomas Rinsch
 *
 */
public class Point 
{
	public float x;
	public float y;
	public float z;


	/**
	 * Konstruktor
	 * @param _x
	 * @param _y
	 */
	public Point(float _x,float _y)
	{
		x=_x;
		y=_y;
		z=0;
	}

	/**
	 * Kontruktor-3D
	 * @param _x
	 * @param _y
	 * @param _z
	 */
	public Point(float _x,float _y, float _z)
	{
		x=_x;
		y=_y;
		z=_z;
	}

	/**
	 * Gibt die neue Position eines Objekts zurueck,
	 * das  um einen anderen punkt rotiert werden soll
	 * @param _pos	Aktuelle Position
	 * @param _pivot Punkt, um den rotiert werden soll
	 * @param _angle Winkel (Wichtig: Als Radian!)
	 * @return neue Position
	 */
	public static Point rotate(Point _pos, Point _pivot, float _angle)
	{
		_angle = (float) Math.toRadians(_angle);
		/*
		 * Vorgehen: Translation des Pivot in den Koordinatenursprung
		 * Danach die Formeln zur Rotation:
		 * X: x*cos(angle) - y * sin(angle)
		 * Y: x*sin(angle) + y * cos(angle)
		 * Danach wieder Translation in den Pivot
		 */
		return new Point(
				(float) (_pivot.x + (_pos.x - _pivot.x) * Math.cos(_angle) - (_pos.y - _pivot.y) * Math.sin(_angle)),
				(float) (_pivot.y + (_pos.y - _pivot.y) * Math.cos(_angle) + (_pos.x - _pivot.x) * Math.sin(_angle))
				);
	}
}